CentOS 7上的程序管理:rpm、yum和源码编译安装 您所在的位置:网站首页 yum 忽略依赖 CentOS 7上的程序管理:rpm、yum和源码编译安装

CentOS 7上的程序管理:rpm、yum和源码编译安装

2024-05-08 08:59| 来源: 网络整理| 查看: 265

简介

在Linux的早期时代(也许吧?我猜的。也可能是Unix。),想要在系统上安装一款应用程序,是比较复杂的。需要专业的人员自行获取程序的源代码,并且编译安装,这是非常的复杂且需要一定的专业功底的,这种方式叫做源码编译安装(后面会描述)。

再后来就有人/组织将这个过程简化了,他们将事先已经编译好的软件打包后,放到互联网上供用户下载。用户下载适用于自己的操作系统和硬件平台的软件包之后,只需要将其“解压”,那么该软件包所包含的各种文件(二进制程序文件、文档文件、库文件和配置文件等)就会基于包作者事先定义好的位置进入各自对应的目录下了。在CentOS上,这种打包工具就叫做rpm,即rpm安装。

但是这种工具又存在一个缺陷,那就是它无法自动解决RPM包之间的依赖性。

假设安装A包需要依赖于B包,安装B包又要依赖于C包。

A --> B --> C

当你安装A包的时候提示你要安装B包,你安装B包的时候又提示你要安装C包,它无法自动去解决这个依赖关系。并且你还要自己去下载被依赖的B包和C包。

因此诞生了一种更高级的包管理器,用于解决上述的RPM的问题,在CentOS上,这种包管理器就叫做yum,即yum安装。不过,在未来,可能是CentOS 8的时候,yum会被dnf工具所取代,在Fedora系统上,已经有dnf工具了。

在不同的Linux发行版中,这种软件包的组织形式有点不同,见下表:

发行版 初级包管理器 高级包管理器 包名称 RHEL系列:Red Hat、CentOS、Fedora rpm yum、dnf *.rpm Debian、Ubuntu dpkg apt-get *.deb S.u.S.E rpm zypper *.rpm

本文的讲解顺序是先讲rpm安装,再讲yum安装,最后说最复杂的源码编译安装。

 

RPM

在当前的运维环境下,一般我们安装某款软件,会直接使用yum命令,而不会单独去下载rpm包通过rpm命令来完成。

更多的是使用rpm命令去执行一下对程序包的查询操作。

程序包的获取

推荐从软件的官方站点获取,或者可以在一些比较大型的受信任的镜像站点获取。

系统发行版的光盘。 项目的官方站点。 www.zabbix.com www.mysq.com 等等。 开源镜像站点及一些rpm包提供站点。 阿里云 网易 EPEL https://pkgs.org/ http://rpmfind.net/ http://rpm.pbone.net/ 自己动手制作rpm包。 程序包的名称

程序包(rpm包)名称的大概格式如下。

NAME-VERSION-RELEASE.OS.ARCH.rpm

示例

perl-5.16.3-293.el7.x86_64.rpm

NAME:软件的名称,例如“perl”。

VERSION:软件的版本,一般格式为“major.minor.release”,即主版本.次版本.发行版本,例如“5.16.3”。

RELEASE:程序包的发行版,发行版可以理解为发行的次数,依次往上叠加,区别于VERSION中的release,这里的RELEASE指的是程序包的发行版本,而不是软件的。可能软件的版本没改变但是程序包再次制作发行了。例如“293”。

OS:Linux系统的大版本,CentOS 6为el6,CentOS 7为el7,el表示Enterprise Linux。

ARCH:硬件平台。例如i386,x86_64,amd64,ppc,noarch。noarch表示该程序包不受硬件平台的限制,可能该包均通过库调用之类来实现自身功能。

主包与支包

程序除了以自身名称命名的包以外,可能还存在一些其他的包用于提供与该程序相关的功能或者用于扩展该程序。

以PHP来举例。

PHP的主包

php-5.4.16-46.el7.x86_64.rpm

PHP的支包

php-bcmath-5.4.16-46.el7.x86_64.rpm # 提供了数学计算相关的PHP扩展库。 php-cli-5.4.16-46.el7.x86_64.rpm # 提供了PHP命令行程序/usr/bin/php。 安装

基本语法如下。

rpm {-i|--install} [install-options] PACKAGE_FILE ...

-v:输出详细信息。

-vv:输出更详细的信息。

-h,--hash:hash marks输出进度条,每个#表示2%的进度。

--test:测试安装,检查并报告依赖关系及冲突消息等,类似于干跑(--dry-run)。

--nodeps:忽略依赖关系,忽略依赖关系之后安装的程序包,可能可以正常运行(比如依赖的只是一个文档类的程序包),不建议这么做。

--replacepkgs:重新安装,一般用于修改了程序包的某个文件无法复原的时候选择的选项,如果重新安装依然无法恢复修改的文件,可以事先删除该文件再重新安装。

--noscripts:禁用rpm包的相关脚本(scriptlet)。该选项等同于“--nopre --nopost --nopreun --nopostun”。

rpm包可以包含四种脚本:

preinstall:安装过程开始之前运行的脚本,%pre,--nopre postinstall:安装过程完成之后运行的脚本,%post,--nopost preuninstall:卸载过程开始之前运行的脚本,%preun,--nopreun postuninstall:卸载过程完成之后运行的脚本,%postun,--nopostun

可以思考一下,比如我们安装nginx或者php-fpm或者MySQL的时候,在系统中会产生与之对应的用于运行服务的用户,那么这个创建用户的操作,应该就是rpm包的脚本所实现的了。

--nosignature:不检查包签名信息,即不检查包来源的合法性。

--nodigest:不检查包摘要信息,即不检查包完整性信息。

包来源合法性和包完整性是什么,在后面会描述,先知道该选项即可。

最常用的选项如下。

rpm -ivh PACKAGE_FILE ... [root@C7 ~]# rpm -ivh zsh-5.0.2-31.el7.x86_64.rpm Preparing... ################################# [100%] Updating / installing... 1:zsh-5.0.2-31.el7 ################################# [100%]

--test选项,也可能会用到。其他选项基本不会使用到。

[root@C7 ~]# rpm -ivh --test zsh-5.0.2-31.el7.x86_64.rpm Preparing... ################################# [100%] package zsh-5.0.2-31.el7.x86_64 is already installed

因为此前已经安装过,所以我们通过测试运行,就可以看到会有已安装的提示。

升级 rpm {-U|--upgrade} [install-options] PACKAGE_FILE ... rpm {-F|--freshen} [install-options] PACKAGE_FILE ...

-U:表示升级或者安装,即如果软件此前未安装,则可以直接安装。

-F:明确表示只能升级,即如果软件此前未安装,则不会直接安装。

一般也会结合-vh选项来使用。

rpm -Uvh PACKAGE_FILE ... rpm -Fvh PACKAGE_FILE ...

--oldpackage:默认情况下,升级操作只可以升级到新版本,使用该选项的话,可执行降级操作。

--replacefiles:即便安装操作会覆盖其他程序包所安装的文件,仍然安装程序包。

--replacepkgs:即便程序包的某些文件已经安装在系统上,仍然安装程序包。

--force:等同于--replacepkgs、--replacefiles和--oldpackage。

从网上下载了zsh 5.1.1版本的,进行升级实验。

[root@C7 ~]# rpm -Uvh --test zsh-5.1-1.gf.el7.x86_64.rpm warning: zsh-5.1-1.gf.el7.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID da8b7718: NOKEY Preparing... ################################# [100%] [root@C7 ~]# rpm -Uvh zsh-5.1-1.gf.el7.x86_64.rpm warning: zsh-5.1-1.gf.el7.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID da8b7718: NOKEY Preparing... ################################# [100%] Updating / installing... 1:zsh-5.1-1.gf.el7 ################################# [ 50%] Cleaning up / removing... 2:zsh-5.0.2-31.el7 ################################# [100%] [root@C7 ~]# rpm -qa | grep -i "zsh" zsh-5.1-1.gf.el7.x86_64

升级新的包之后,会卸载旧的包。rpm -qa命令用于查看当前系统上安装的程序包,下文会描述。

仔细看的话,可以发现有一行警告。

warning: zsh-5.1-1.gf.el7.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID da8b7718: NOKEY

这是因为rpm包的来源合法性和包完整性无法得到验证,我们没有提供包提供方的key导致的,后面会描述。

降级操作。

[root@C7 ~]# rpm -q zsh zsh-5.1-1.gf.el7.x86_64 [root@C7 ~]# rpm -Uvh --oldpackage zsh-5.0.2-31.el7.x86_64.rpm Preparing... ################################# [100%] Updating / installing... 1:zsh-5.0.2-31.el7 ################################# [ 50%] Cleaning up / removing... 2:zsh-5.1-1.gf.el7 ################################# [100%] [root@C7 ~]# rpm -q zsh zsh-5.0.2-31.el7.x86_64

注意事项:

不要对内核做升级操作;若想要使用新版本的内核,Linux支持多内核版本并存,因此直接安装新版本内核即可。 如果某原程序包的配置文件在安装后曾被修改过,升级时,新版程序包提供的同一个配置文件不会覆盖老版本已修改过的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供。 卸载 rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...

注意,在安装和升级的过程中,rpm命令的操作对象都是rpm包文件的名称(PACKAGE_FILE),例如“zsh-5.0.2-31.el7.x86_64.rpm”。

而卸载的时候,只需要rpm包名(PACKAGE_NAME)即可,例如“zsh”。

--allmatches:卸载所有匹配PACKAGE_NAME的所有版本的程序包。

我这里无法测试该选项,例如zsh,无论我升级还是降级,rpm都只会保留一个版本的zsh,因此我不知道如何测试该选项。

不过一般卸载所使用到的选项并不多,和安装一样,使用一些通用的选项即可。

[root@C7 ~]# rpm -evh zsh Preparing... ################################# [100%] Cleaning up / removing... 1:zsh-5.0.2-31.el7 ################################# [100%] [root@C7 ~]# rpm -q zsh package zsh is not installed 查询

查询才是rpm使用中最经常用到的操作。因为安装、升级和卸载都可以使用yum命令来完成,而查询我们则基本上是使用rpm命令。

rpm {-q|--query} [select-options] [query-options] [select-options]

PACKAGE_NAME:查询指定的程序包是否已安装,若已安装则会显示其版本。

[root@C7 ~]# rpm -q bash bash-4.2.46-30.el7.x86_64

-a, --all:查询所有已安装的程序包,可以结合管道+grep命令过滤。

[root@C7 ~]# rpm -qa | grep -i "bash" bash-4.2.46-30.el7.x86_64 bash-completion-2.1-6.el7.noarch

-f, --file FILE:查询出指定的FILE是哪个程序包的。

[root@C7 ~]# rpm -qf /bin/bash bash-4.2.46-30.el7.x86_64

-g, --group GROUP:查询某个程序包组包含哪些程序包。注意,这里的GROUP,并不是通过yum grouplist中所看到的程序包组名称,而是通过-i选项所查询到的包详细信息中的GROUP!

例如我们常安装的包组为Development Tools,就不是这里所指的GROUP。即便已安装了该包组。

[root@C7 ~]# rpm -qg "Development Tools" group Development Tools does not contain any packages [root@C7 ~]# rpm -qi bash | grep -i "^group" Group : System Environment/Shells [root@C7 ~]# rpm -qg "System Environment/Shells" bash-4.2.46-30.el7.x86_64 tcsh-6.18.01-15.el7.x86_64

-p, --package PACKAGE_FILE:对未安装的程序包执行查询操作,查询的内容与query-options相关。

  在query-options中,许多的选项可以用于查看已安装的程序包的信息;

  但是如果我们拥有一个RPM包文件,但是不打算安装它,想查看此RPM包所包含的文件;

  就可以使用命令“rpm -qpl PACKAGE_FILE”,这就是p选项的用法;

例如,假设我们本机没有安装zsh,那么我们就无法查询其相关信息了。

[root@C7 ~]# rpm -qi zsh package zsh is not installed

但如果我们有程序包文件的话,就可以借助-p选项来实现查询的功能,只不过这里的命令参数就是PACKAGE_FILE而不是PACKAGE_NAME了。

[root@C7 ~]# rpm -qpi zsh-5.0.2-31.el7.x86_64.rpm

--whatprovides CAPABILITY:查询所有包中具备某种能力(capability)的程序包。这里的能力指的是什么,就需要看底下的query-options中的--provides和-R选项了。

首先我们基于下文的选项,可以知道bash程序包提供了以下能力。

[root@C7 ~]# rpm -q --provides bash /bin/bash /bin/sh bash = 4.2.46-30.el7 bash(x86-64) = 4.2.46-30.el7 config(bash) = 4.2.46-30.el7

以“/bin/bash”这个能力来举例,我们可以查看哪些程序包提供了该能力。

[root@C7 ~]# rpm -q --whatprovides "/bin/bash" bash-4.2.46-30.el7.x86_64

而如果能力是那种带有等于号与版本信息的,应该忽略掉等于号和版本信息,只保留能力名称,并且需要使用单引号或者双引号。

[root@C7 ~]# rpm -q --whatprovides "bash(x86-64) = 4.2.46-30.el7" no package provides bash(x86-64) = 4.2.46-30.el7 [root@C7 ~]# rpm -q --whatprovides "bash(x86-64)" bash-4.2.46-30.el7.x86_64 [root@C7 ~]# rpm -q --whatprovides bash(x86-64) -bash: syntax error near unexpected token `(' [root@C7 ~]# rpm -q --whatprovides 'bash(x86-64)' bash-4.2.46-30.el7.x86_64

--whatrequires CAPABILITY:查询所有包中需要某种能力(capability)的程序包。

[root@C7 ~]# rpm -q --whatrequires "/bin/bash" nss-softokn-freebl-3.34.0-2.el7.x86_64 copy-jdk-configs-3.3-2.el7.noarch iproute-4.11.0-14.el7.x86_64 xorg-x11-xinit-1.3.4-2.el7.x86_64 ...

我猜测,rpm包应该就是基于包的能力(capability)来决定包与包之间的依赖关系的。

能力这块,目前知道即可,我们并不需要手工去查询来解决依赖关系,因为我们有yum工具。

[query-options]

--changelog:显示程序包的变更日志(changelog),这里的变更日志指的是RPM程序包的,而非软件源码包的。程序包的changelog和软件的changelog的区别可能在于,比如软件源代码可以不改变,但是程序包的打包方式改变了,例如部分文件的存放位置发生了修改。

[root@C7 ~]# rpm -q --changelog bash | head * Mon Sep 25 2017 Siteshwar Vashisht - 4.2.46-30 - Check for multibyte characters in commands Resolves: #1487615 * Thu Aug 03 2017 Siteshwar Vashisht - 4.2.46-29 - Fix a pipe fd leak in process substitution Resolves: #1473245 * Tue Mar 07 2017 Kamil Dudka


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有